package com.jackiepenghe.testvideocompress;

import android.util.Log
import com.arthenica.ffmpegkit.FFmpegKit
import com.arthenica.ffmpegkit.ReturnCode
import java.io.File

/**
 * 视频压缩器类
 *
 * 该类用于压缩视频文件。它提供了一个核心方法 `compressVideo`，用于执行视频压缩操作。
 *
 * 核心功能：
 * - 压缩视频文件，支持自定义输入输出路径和压缩完成后的回调函数。
 *
 * 使用示例：
 * ```kotlin
 * val videoCompressor = VideoCompressor()
 * videoCompressor.compressVideo("input.mp4", "output.mp4") { success ->
 *     if (success) {
 *         println("视频压缩成功")
 *     } else {
 *         println("视频压缩失败")
 *     }
 * }
 * ```
 *
 * 构造函数参数：
 * - 无特殊构造函数参数。
 *
 * 特殊使用限制或潜在的副作用：
 * - 该类依赖于FFmpegKit库，确保在使用前已正确集成该库。
 * - 压缩过程中，如果输入文件不存在或输出路径不可写，会导致压缩失败。
 * - 压缩操作是异步执行的，确保在回调函数中处理压缩结果。
 */
object VideoCompressor {

    /**
     * 压缩视频文件
     * @param inputPath 输入视频文件的路径
     * @param outputPath 输出视频文件的路径
     * @param onCompletion 压缩完成后的回调函数，接收一个布尔值表示压缩是否成功
     */
    fun compressVideo(inputPath: String, outputPath: String, onCompletion: (Boolean) -> Unit) {
        // 构建FFmpeg命令，使用libx264编码器，CRF值为28，输入文件为inputPath，输出文件为outputPath
        val command = "-i $inputPath -vcodec libx264 -crf 28 $outputPath"

        // 异步执行FFmpeg命令
        FFmpegKit.executeAsync(command) { session ->
            // 获取命令执行后的返回码
            val returnCode = session.returnCode

            // 判断返回码是否表示成功
            if (ReturnCode.isSuccess(returnCode)) {
                // Compression successful
                onCompletion(true)
            } else if (ReturnCode.isCancel(returnCode)) {
                // Compression cancelled
                onCompletion(false)
            } else {
                // Compression failed
                onCompletion(false)
            }
        }
    }

    fun compressVideo1(inputPath: String, outputPath: String, onCompletion: (Boolean) -> Unit) {
//        try {
//            val processBuilder = ProcessBuilder(
//                "ffmpeg",
//                "-y",  // 覆盖输出文件
//                "-i", inputPath,  // 输入文件
//                "-strict", "experimental",  // 处理编码器问题
//                "-b:v", "500k",  // 设置比特率为500kbps
//                "-bufsize", "500k",  // 设置缓冲区大小
//                "-vcodec", "libx264",  // 使用x264编码器
//                "-s", "640x360",  // 设置分辨率
//                "-r", "30",  // 设置帧率为30fps
//                outputPath // 输出文件
//            )
//
//            val process = processBuilder.start()
//            val exitCode = process.waitFor()
//            if (exitCode == 0) {
//                Log.d("FFmpeg", "视频压缩成功")
//                onCompletion(true)
//            } else {
//                Log.e("FFmpeg", "视频压缩失败")
//                onCompletion(false)
//            }
//        } catch (e: Exception) {
//            e.printStackTrace()
//            onCompletion(false)
//        }
        val file = File(outputPath)
        val parent = file.parentFile
        if (!parent.exists()){
            parent.mkdirs()
        }
        if (!file.exists()){
            file.createNewFile()
        }
//        val command = "ffmpeg -y -i $inputPath -strict experimental -b:v 500k -bufsize 500k -vcodec libx264 -s 640x360 -r 30 $outputPath"
//        val command = "-i $inputPath -b:v 1000k -bufsize 2000k -c:v mpeg4 -crf 28 -c:a copy $outputPath -y"
        val command = " -i $inputPath -b:v 500K -s 800x600 -r 20 -c:v libx264 $outputPath -y"
        // 异步执行FFmpeg命令
        FFmpegKit.executeAsync(command) { session ->
            // 获取命令执行后的返回码
            val returnCode = session.returnCode

            // 判断返回码是否表示成功
            if (ReturnCode.isSuccess(returnCode)) {
                // Compression successful
                onCompletion(true)
            } else if (ReturnCode.isCancel(returnCode)) {
                // Compression cancelled
                onCompletion(false)
            } else {
                // Compression failed
                onCompletion(false)
            }
        }
    }
}
